package edu.uoc.tds.pec3.cliente;


import edu.uoc.tds.pec3.comun.PEC3Exception;
import edu.uoc.tds.pec3.comun.Evento;
import edu.uoc.tds.pec3.comun.Proveedor;
import edu.uoc.tds.pec3.comun.ConceptoGasto;
import edu.uoc.tds.pec3.comun.RemotoInterface;
import edu.uoc.tds.pec3.i18n.TDSLanguageUtils;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

/**
 *
 * @author JUAN ANTONIO
 */
public class Cliente extends JFrame implements ActionListener {
    private RemotoInterface remotoPEC3;
    private ArrayList<Evento> eventos;
    private ArrayList<Proveedor> proveedores;
    private ArrayList<ConceptoGasto> conceptos;
    private JMenuBar barraMenu;
    private JMenu inicio;
    private JMenu gestorFacturas;
    private JMenuItem conectar;
    private JMenuItem desconectar;
    private JMenuItem altaFactura;
    private JMenuItem consultaGastosEvento;
    private JMenuItem gastosTotalesConcepto;
    private JPanel panelCentral;

  public Cliente(){
        setLocation(300, 100);
        setPreferredSize(new Dimension(600, 300));
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setResizable(false);

        setTitle(TDSLanguageUtils.getMessage("clientePEC3.frame.titulo"));

        iniciarComponentes();

        pack();
        setVisible(true);
    }

    private void iniciarComponentes(){
        eventos = new ArrayList<Evento>();
        proveedores = new ArrayList<Proveedor>();
        conceptos = new ArrayList<ConceptoGasto>();
        barraMenu = new JMenuBar();
        
        inicio = new JMenu(TDSLanguageUtils.getMessage("clientePEC3.menu1.titulo"));

        gestorFacturas = new JMenu(TDSLanguageUtils.getMessage("clientePEC3.menu2.titulo"));
        conectar = new JMenuItem(TDSLanguageUtils.getMessage("clientePEC3.menu11.titulo"));
        desconectar = new JMenuItem(TDSLanguageUtils.getMessage("clientePEC3.menu12.titulo"));
        altaFactura = new JMenuItem(TDSLanguageUtils.getMessage("clientePEC3.menu21.titulo"));
        consultaGastosEvento = new JMenuItem(TDSLanguageUtils.getMessage("clientePEC3.menu22.titulo"));
        gastosTotalesConcepto = new JMenuItem(TDSLanguageUtils.getMessage("clientePEC3.menu23.titulo"));

        inicio.add(conectar);
        inicio.add(desconectar);
        gestorFacturas.add(altaFactura);
        gestorFacturas.add(consultaGastosEvento);
        gestorFacturas.add(gastosTotalesConcepto);
        barraMenu.add(inicio);
        barraMenu.add(gestorFacturas);

        add(barraMenu, BorderLayout.NORTH);

        conectar.addActionListener(this);
        desconectar.addActionListener(this);
        altaFactura.addActionListener(this);
        consultaGastosEvento.addActionListener(this);
        gastosTotalesConcepto.addActionListener(this);

        setPanelCentral(new PanelInicial());

        //Al entrar en la pantalla solo estará disponible la opción
        //de conectarse al RMI
         desconectar.setEnabled(false);
         altaFactura.setEnabled(false);
         consultaGastosEvento.setEnabled(false);
         gastosTotalesConcepto.setEnabled(false);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == conectar){
            try {
                conectarRMI();
                getObjetos();
                
            } catch (PEC3Exception ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (e.getSource() == desconectar){
              desconectarRMI();

        } else if (e.getSource() == altaFactura) {
            setPanelCentral(new PanelAltaFactura(this));

        } else if (e.getSource() == consultaGastosEvento){
            setPanelCentral(new PanelConsultaGastosEvento(this));

        } else if (e.getSource() == gastosTotalesConcepto){
            setPanelCentral(new PanelGastosTotalesConcepto(this));
        }
    }

    private void conectarRMI() throws PEC3Exception {
        try {
            remotoPEC3 = (RemotoInterface)Naming.lookup("rmi://localhost/eGestion");
            configurarOpciones(true);

        } catch(NotBoundException notboundexception) {
                throw new PEC3Exception(PEC3Exception.ERR_NOT_BOUND);

        } catch(MalformedURLException malformedurlexception) {
                throw new PEC3Exception(PEC3Exception.ERR_URL);

        } catch(RemoteException remoteexception) {
            throw new PEC3Exception(PEC3Exception.ERR_REMOTO);
        }
    }

    private void desconectarRMI() {
        remotoPEC3 = null;
        configurarOpciones(false);
        setPanelCentral(new PanelInicial());
    }

    private void getObjetos(){
        try {
            eventos = remotoPEC3.getEventos();
            proveedores = remotoPEC3.getProveedores();
            conceptos = remotoPEC3.getConceptos();

        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    /**
     * Metodo para configurar las opciones de la barra de menu, segun si RMI está
     * conectado o no.
     * @param conectado
     */
    private void configurarOpciones(boolean conectado) {
        conectar.setEnabled(!conectado);
        desconectar.setEnabled(conectado);
        altaFactura.setEnabled(conectado);
        consultaGastosEvento.setEnabled(conectado);
        gastosTotalesConcepto.setEnabled(conectado);

    }

    /**
     * Configura el panel central de la ventana.
     * 
     * @param panelCentral
     */
    public void setPanelCentral(JPanel panelCentral) {
        if (this.panelCentral != null){
            remove(this.panelCentral);
        }
        this.panelCentral = panelCentral;
        add(this.panelCentral, BorderLayout.CENTER);
        pack();
    }

    public ArrayList<String> getDescripcionesConceptos() {
        ArrayList<String> descripciones = new ArrayList<String>();

        for (Iterator<ConceptoGasto> it = conceptos.iterator(); it.hasNext();) {
            descripciones.add(it.next().getDescripcion());
        }

        return descripciones;
    }

    public ArrayList<String> getDescripcionesEventos() {
        ArrayList<String> descripciones = new ArrayList<String>();

        for (Iterator<Evento> it = eventos.iterator(); it.hasNext();) {
            descripciones.add(it.next().getDescripcion());
        }

        return descripciones;
    }

    public ArrayList<String> getDescripcionesProveedores() {
        ArrayList<String> descripciones = new ArrayList<String>();

        for (Iterator<Proveedor> it = proveedores.iterator(); it.hasNext();) {
            descripciones.add(it.next().getNombreEntidad());
        }

        return descripciones;
    }

    public ArrayList<ConceptoGasto> getConceptos() {
        return conceptos;
    }

    public void setConceptos(ArrayList<ConceptoGasto> conceptos) {
        this.conceptos = conceptos;
    }

    public ArrayList<Evento> getEventos() {
        return eventos;
    }

    public void setEventos(ArrayList<Evento> eventos) {
        this.eventos = eventos;
    }

    public ArrayList<Proveedor> getProveedores() {
        return proveedores;
    }

    public void setProveedores(ArrayList<Proveedor> proveedores) {
        this.proveedores = proveedores;
    }

    public RemotoInterface getRemotoPEC3() {
        return remotoPEC3;
    }
}
